home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / net / getprotoent.c < prev    next >
C/C++ Source or Header  |  1988-07-01  |  2KB  |  114 lines

  1. /*
  2.  * Copyright (c) 1983 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that this notice is preserved and that due credit is given
  7.  * to the University of California at Berkeley. The name of the University
  8.  * may not be used to endorse or promote products derived from this
  9.  * software without specific prior written permission. This software
  10.  * is provided ``as is'' without express or implied warranty.
  11.  */
  12.  
  13. #if defined(LIBC_SCCS) && !defined(lint)
  14. static char sccsid[] = "@(#)getprotoent.c    5.4 (Berkeley) 3/7/88";
  15. #endif /* LIBC_SCCS and not lint */
  16.  
  17. #include <stdio.h>
  18. #include <sys/types.h>
  19. #include <sys/socket.h>
  20. #include <netdb.h>
  21. #include <ctype.h>
  22.  
  23. #define    MAXALIASES    35
  24.  
  25. static char PROTODB[] = "/etc/protocols";
  26. static FILE *protof = NULL;
  27. static char line[BUFSIZ+1];
  28. static struct protoent proto;
  29. static char *proto_aliases[MAXALIASES];
  30. static char *any();
  31. int _proto_stayopen;
  32.  
  33. setprotoent(f)
  34.     int f;
  35. {
  36.     if (protof == NULL)
  37.         protof = fopen(PROTODB, "r" );
  38.     else
  39.         rewind(protof);
  40.     _proto_stayopen |= f;
  41. }
  42.  
  43. endprotoent()
  44. {
  45.     if (protof) {
  46.         fclose(protof);
  47.         protof = NULL;
  48.     }
  49.     _proto_stayopen = 0;
  50. }
  51.  
  52. struct protoent *
  53. getprotoent()
  54. {
  55.     char *p;
  56.     register char *cp, **q;
  57.  
  58.     if (protof == NULL && (protof = fopen(PROTODB, "r" )) == NULL)
  59.         return (NULL);
  60. again:
  61.     if ((p = fgets(line, BUFSIZ, protof)) == NULL)
  62.         return (NULL);
  63.     if (*p == '#')
  64.         goto again;
  65.     cp = any(p, "#\n");
  66.     if (cp == NULL)
  67.         goto again;
  68.     *cp = '\0';
  69.     proto.p_name = p;
  70.     cp = any(p, " \t");
  71.     if (cp == NULL)
  72.         goto again;
  73.     *cp++ = '\0';
  74.     while (*cp == ' ' || *cp == '\t')
  75.         cp++;
  76.     p = any(cp, " \t");
  77.     if (p != NULL)
  78.         *p++ = '\0';
  79.     proto.p_proto = atoi(cp);
  80.     q = proto.p_aliases = proto_aliases;
  81.     if (p != NULL) {
  82.         cp = p;
  83.         while (cp && *cp) {
  84.             if (*cp == ' ' || *cp == '\t') {
  85.                 cp++;
  86.                 continue;
  87.             }
  88.             if (q < &proto_aliases[MAXALIASES - 1])
  89.                 *q++ = cp;
  90.             cp = any(cp, " \t");
  91.             if (cp != NULL)
  92.                 *cp++ = '\0';
  93.         }
  94.     }
  95.     *q = NULL;
  96.     return (&proto);
  97. }
  98.  
  99. static char *
  100. any(cp, match)
  101.     register char *cp;
  102.     char *match;
  103. {
  104.     register char *mp, c;
  105.  
  106.     while (c = *cp) {
  107.         for (mp = match; *mp; mp++)
  108.             if (*mp == c)
  109.                 return (cp);
  110.         cp++;
  111.     }
  112.     return ((char *)0);
  113. }
  114.